package cn.vendcommon.com.entity.enums;


import lombok.Getter;

import java.util.concurrent.TimeUnit;

/**
 * UAA 模块使用的 Redis Key 枚举
 * 1. prefix: 具体的 key 前缀
 * 2. unit/expireTime: 过期时间（用于对整个 key 设 TTL）
 *
 * 说明：
 * - Hash（opsForHash）内部的 field 无法单独设过期时间，只有对整个 hashKey 设过期时间有效。
 * - 如果你需要 field 级别的自动过期，建议改为用单个 String key（如 uaa:user:{id}）并给该 key 设置 TTL。
 */
@Getter
public enum UaaRedisKey {

    // 存放用户详情的 Hash（field = phone）
    USER_HASH("uaa:user:hash:", TimeUnit.DAYS, 7),

    // 存放用户活跃度/时间的 ZSet（member = phone, score = timestamp）
    USER_ZSET("uaa:user:zset:", TimeUnit.DAYS, 7),

    // 用户 token 存储（单 key 或 prefix + token），适合设置 TTL
    USER_TOKEN("uaa:user:token:", TimeUnit.MINUTES, 30);

    private final String prefix;
    private final TimeUnit unit;
    private final int expireTime;

    UaaRedisKey(String prefix, TimeUnit unit, int expireTime) {
        this.prefix = prefix;
        this.unit = unit;
        this.expireTime = expireTime;
    }

    /**
     * 拼接实际 key，例如 getRealKey("123") -> "uaa:user:hash:123"
     */
    public String getRealKey(String key) {
        return this.prefix + key;
    }

    /**
     * 获取过期时间（数值）
     */
    public int getExpireTime() {
        return expireTime;
    }

    /**
     * 获取过期时间单位
     */
    public TimeUnit getUnit() {
        return unit;
    }

    /**
     * 辅助：返回以毫秒为单位的过期时长（方便某些 API 使用）
     */
    public long getExpireMillis() {
        return unit.toMillis(expireTime);
    }
}
